#ifndef __CBB_MEMORY_H__
#define __CBB_MEMORY_H__

#include <stdint.h>

/* ---------------------------------- 内存大小定义 ---------------------------------- */

#define STATIC_MEM_SIZE 1 * 1024    // 静态内存大小(4字节对齐)
#define DYNAMIC_MEM_SIZE 0 * 1024   // 动态内存大小(4字节对齐)

#ifndef STATIC_MEM_SIZE
#error "STATIC_MEM_SIZE not defined"
#define STATIC_MEM_SIZE 0
#endif

#ifndef DYNAMIC_MEM_SIZE
#error "DYNAMIC_MEM_SIZE not defined"
#define DYNAMIC_MEM_SIZE 0
#endif

/* ---------------------------------- 静态内存分配 ---------------------------------- */

#if STATIC_MEM_SIZE > 0

#define S_MEM_SIZE STATIC_MEM_SIZE      // 静态内存大小(4字节对齐)
#define S_MALLOC(size) cbb_s_malloc(size)   // 静态内存申请 -- 可替换为自己的内存管理函数

/**
 * @brief 静态内存申请
 * @param pstMem 内存结构体
 * @param size 申请的内存大小
 * @return 成功返回申请到的内存地址，失败返回NULL
 */
void* cbb_s_malloc(uint32_t size);

/**
 * @brief 获取内存剩余大小
 * @param pstMem 内存结构体
 * @return 剩余内存大小
 */
uint32_t cbb_get_s_mem_left(void);

/**
 * @brief 获取已使用的内存大小
 * @param pstMem 内存结构体
 * @return 已使用的内存大小
 */
uint32_t cbb_get_s_mem_used(void);

/**
 * @brief 清空内存
 * @param pstMem 内存结构体
 */
void cbb_clear_s_mem(void);

#endif

/* ---------------------------------- 动态内存分配 ---------------------------------- */

#if DYNAMIC_MEM_SIZE > 0

#define A_MEM_SIZE DYNAMIC_MEM_SIZE     // 动态内存大小(4字节对齐)
#define A_MALLOC(size) cbb_a_malloc(size)   // 动态内存申请 -- 可替换为自己的内存管理函数
#define A_FREE(size) cbb_a_free(size)   // 动态内存申请 -- 可替换为自己的内存管理函数

/**
 * @brief 动态内存申请
 * @param size 申请的内存大小
 * @return 成功返回申请到的内存地址，失败返回NULL
 */
void* cbb_a_malloc(uint32_t size);

/**
 * @brief 动态内存释放
 * @param pvAddr 内存地址
 * @return 成功返回1，失败返回0
 */
uint8_t cbb_a_free(void* pvAddr); // 动态内存释放

/**
 * @brief 获取内存剩余大小
 * @param pstMem 内存结构体
 * @return 剩余内存大小
 */
uint32_t cbb_get_a_mem_left(void);

 /**
  * @brief 获取已使用的内存大小
  * @param pstMem 内存结构体
  * @return 已使用的内存大小
  */
uint32_t cbb_get_a_mem_used(void);
 
 /**
  * @brief 清空内存
  * @param pstMem 内存结构体
  */
void cbb_clear_a_mem(void);
#endif

#endif /* __MEMORY_H__ */
